package com.util;

import com.javabean.Role;
import com.javabean.User;
import com.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
//4书写测试
public class test {
//    @Test
//    public void t1(){
//        //1)加载spring核心配置文件 创建spring容器对象
//        ClassPathXmlApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        //2)通过配置文件的id 从spring容器中获取指定类的对象
//        UserService userService = (UserService) applicationContext.getBean("userService");
//        //3)使用
//        userService.save();
//        //4)关闭容器
//        applicationContext.close();
//    }
//    @Test
//    public void t2(){
//        //SpringAPI介绍
//        //ApplicationContext代表spring容器接口  用于保存容器对象
//        //实现类1 ClassPathXmlApplicationContext 从类路径(根目录)下加载xml配置文件 创建spring容器对象
//        //实现类2 FileSystemXmlApplicationContext 从文件目录中加载xml配置文件 创建spring容器对象
//        //实现类3 AnnotationConfigApplicationContext  基于注解开发 加载注解配置类 创建spring容器对象
//        ApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        //getBean方法 是一个重载方法 可以用通过字符串id  与class类型进行获取
//        User u1 = (User) applicationContext.getBean("u1");
//        System.out.println(u1);
//        //通过类型进行匹配获取 从spring管理的所有类中 找到匹配类型的数据
//        //但是 如果交由spring管理的多个类中 有类型相似的 会导致无法识别获取错误
//        User u2 = (User) applicationContext.getBean("u2");
//        System.out.println(u2);
//        //默认情况下 spring管理类创建的对象是单例的
//        System.out.println(u1.hashCode());
//        System.out.println(u1.hashCode());
//        System.out.println(u1.equals(u2));
//        System.out.println(u1==u2);
//
//    }
//    @Test
//    public void t3(){
//        //默认 在加载spring核心配置文件时 就会调用指定对象的无参构造方法创建对象
//        ClassPathXmlApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        User u1 = (User) applicationContext.getBean("u1");
//        System.out.println(u1);
//        applicationContext.close();
//    }
//    @Test
//    public void t4(){
//        //将范围属性scope设置为prototype 多例  对象会在每次使用getBean方法获取调用构造方法 创建对象
//        //单例范围的对象 会随着spring容器创建而创建 spring容器使用而存活 spring容器关闭而销毁
//        //多例范围的对象 会随着每次方法调用而创建 正常使用而活 基于jvm垃圾回收算法进行销毁
//        ClassPathXmlApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        User u1 = (User) applicationContext.getBean("u2");
//        System.out.println(u1);
//        User u2 = (User) applicationContext.getBean("u2");
//        System.out.println(u2);
//        User u3= (User) applicationContext.getBean("u2");
//        System.out.println(u3);
//        applicationContext.close();
//    }
//
//    @Test
//    public void t5(){
//        ClassPathXmlApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        User u3 = (User) applicationContext.getBean("u3");
//        u3.setName("被销毁的id为U3的对象");
//        applicationContext.close();
//        //如果范围设置为单例  会在加载spring配置文件创建spring容器时 创建对象 并自动调用初始化方法
//        //在使用时 使用的是唯一对象 并且该对象交由spring容器管理
//        //在销毁时 会先调用所有交由spring容器管理的对象的 销毁方法
//    }
//    @Test
//    public void t6(){
//        ClassPathXmlApplicationContext applicationContext = new
//                ClassPathXmlApplicationContext("applicationContext.xml");
//        System.out.println("~~~~~~~~~~~~~~~~~");
//        User u4 = (User) applicationContext.getBean("u4");
//        u4.setName("u4");
//        System.out.println("~~~~~~~~~~~~~~~~~");
//        applicationContext.close();
//        //如果范围设置为多例
//        //spring容器仅会在 调用getBean方法时创建对象 并调用对象的初始化方法
//        //因为多例模式 每次都会创建新的对象 所以创建的对象不会交由spring进行管理 而是直接使用
//        //所以spring容器关闭时 不会调用对应的销毁方法
//    }

    @Test
    public void t1(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) applicationContext.getBean("userService");
        userService.save();
    }
    @Test
    public void t2(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("d11");
        System.out.println(user);
    }
    @Test
    public void t3(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("d2");
        System.out.println(user);

    }
    @Test
    public void t4(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("d3");
        System.out.println(user);

    }
    @Test
    public void t5(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        Role role = (Role) applicationContext.getBean("r1");
        System.out.println(role);

    }
    @Test
    public void t6(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        Role role = (Role) applicationContext.getBean("r2");
        System.out.println(role);

    }
    @Test
    public void t7(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("d1");
        System.out.println(user);
    }
    @Test
    public void b3(){
        ApplicationContext applicationContext = new
                ClassPathXmlApplicationContext("applicationContext.xml");
        User user = (User) applicationContext.getBean("b3");
        System.out.println(user);
    }
}

